﻿#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

typedef double Real;
typedef long long MyInt;

typedef struct {
	int n;
	int data[10][10];
}Matrix;

typedef struct {
	int n;
	int v[21];
}Data;

typedef struct TContext_s
{
	int m;
	int n;
	Matrix mat;
	Matrix m2;
}TContext;

TContext context;


void read_data(TContext* ctx)
{
	scanf("%d", &ctx->m);
	scanf("%d", &ctx->n);
	ctx->m %= ctx->n;
	ctx->mat.n = ctx->n;
	for (int i = 0; i < ctx->n; ++i)
		for (int j = 0; j < ctx->n; ++j)
			scanf("%d", &ctx->mat.data[i][j]);
	ctx->m2 = ctx->mat;
}

void swap(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}

void mat_swap_col(Matrix* mat, int c0, int c1)
{
	for (int i = 0; i < mat->n; ++i)
		swap(&mat->data[i][c0], &mat->data[i][c1]);
}

void mat_reverse(Matrix* mat, int c0, int c1)
{
	for (int i = c0, j = c1; i < j; ++i, --j)
		mat_swap_col(mat, i, j);
}

void mat_dump(Matrix* A)
{
	for (int i = 0; i < A->n; ++i)
	{
		for (int j = 0; j < A->n; ++j) {
			printf("%d ", A->data[i][j]);
		}
		printf("\n");
	}
}

void dump(TContext* ctx,int m)
{
	Matrix* mat = &ctx->mat;
	Matrix* m2 = &ctx->m2;
	//for (int i = 0; i < mat->n; ++i)
	//{
	//	for (int j = 0; j < mat->n; ++j) {
	//		printf("%d ", m2->data[i][(m2->n-m+j)% m2->n]);
	//	}
	//	printf("\n");
	//}
	mat_dump(mat);
}
void do_task(TContext* ctx)
{
	mat_reverse(&ctx->mat, 0, ctx->n-ctx->m - 1);
	mat_reverse(&ctx->mat, ctx->n - ctx->m, ctx->n -1);
	mat_reverse(&ctx->mat, 0, ctx->n - 1);
	dump(ctx,ctx->m);
}

void solve(TContext* ctx)
{
	read_data(ctx);
	do_task(ctx);
}

int main()
{
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/DataStructure/M2019秋C入门和进阶练习集/7-147.txt", "r", stdin);
	solve(&context);
	return 0;
}
